<!DOCTYPE html>
<html lang="zh_cn">
<head>
          <title>来玩魔王的咚</title>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta charset="utf-8" />
        <!-- twitter card metadata -->
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="/images/mowang.png">
<meta name="twitter:site" content="">
<meta name="twitter:title" content="git骚操作">
<meta name="twitter:description" content="<p>git各种错误提交后的应对和处理</p>">
        <!-- OG Tags -->
<meta property="og:url" content="/git-how-to-advanced.html"/>
<meta property="og:title" content="来玩魔王的咚 | git骚操作" />
<meta property="og:description" content="<p>git各种错误提交后的应对和处理</p>" />
        <!-- favicon -->
        <link rel="icon" type="image/png" href="/images/mowang.png">
        <!-- moment.js for date formatting -->
        <script src="/theme/js/moment.js"></script>
        <!-- css -->
        <link rel="stylesheet" type="text/css" href="/theme/css/main.css" />
        <!-- 左边的menu，如果页面高度不够，就跟着滚动，否则文章分类显示不全 -->
        <link rel="stylesheet" type="text/css" href="/theme/css/mycss/menu.css" />
		<script>
			
                /*! grunt-grunticon Stylesheet Loader - v2.1.2 | https://github.com/filamentgroup/grunticon | (c) 2015 Scott Jehl, Filament Group, Inc. | MIT license. */
    
    (function(e){function t(t,n,r,o){"use strict";function a(){for(var e,n=0;u.length>n;n++)u[n].href&&u[n].href.indexOf(t)>-1&&(e=!0);e?i.media=r||"all":setTimeout(a)}var i=e.document.createElement("link"),l=n||e.document.getElementsByTagName("script")[0],u=e.document.styleSheets;return i.rel="stylesheet",i.href=t,i.media="only x",i.onload=o||null,l.parentNode.insertBefore(i,l),a(),i}var n=function(r,o){"use strict";if(r&&3===r.length){var a=e.navigator,i=e.Image,l=!(!document.createElementNS||!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect||!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1")||e.opera&&-1===a.userAgent.indexOf("Chrome")||-1!==a.userAgent.indexOf("Series40")),u=new i;u.onerror=function(){n.method="png",n.href=r[2],t(r[2])},u.onload=function(){var e=1===u.width&&1===u.height,a=r[e&&l?0:e?1:2];n.method=e&&l?"svg":e?"datapng":"png",n.href=a,t(a,null,null,o)},u.src="",document.documentElement.className+=" grunticon"}};n.loadCSS=t,e.grunticon=n})(this);(function(e,t){"use strict";var n=t.document,r="grunticon:",o=function(e){if(n.attachEvent?"complete"===n.readyState:"loading"!==n.readyState)e();else{var t=!1;n.addEventListener("readystatechange",function(){t||(t=!0,e())},!1)}},a=function(e){return t.document.querySelector('link[href$="'+e+'"]')},c=function(e){var t,n,o,a,c,i,u={};if(t=e.sheet,!t)return u;n=t.cssRules?t.cssRules:t.rules;for(var l=0;n.length>l;l++)o=n[l].cssText,a=r+n[l].selectorText,c=o.split(");")[0].match(/US\-ASCII\,([^"']+)/),c&&c[1]&&(i=decodeURIComponent(c[1]),u[a]=i);return u},i=function(e){var t,o,a;o="data-grunticon-embed";for(var c in e)if(a=c.slice(r.length),t=n.querySelectorAll(a+"["+o+"]"),t.length)for(var i=0;t.length>i;i++)t[i].innerHTML=e[c],t[i].style.backgroundImage="none",t[i].removeAttribute(o);return t},u=function(t){"svg"===e.method&&o(function(){i(c(a(e.href))),"function"==typeof t&&t()})};e.embedIcons=i,e.getCSS=a,e.getIcons=c,e.ready=o,e.svgLoadedCallback=u,e.embedSVG=u})(grunticon,this);
                
                grunticon(["/theme/css/icons.data.svg.css", "/theme/css/icons.data.png.css", "/theme/css/icons.fallback.css"]);
            </script>
        <noscript><link href="/theme/css/icons.fallback.css" rel="stylesheet"></noscript>
        <!-- menu toggle javascript -->
        <script type="text/javascript">
            document.addEventListener("DOMContentLoaded", initMenu);
            
            function initMenu(){
                var menu = document.getElementById("menu");
                var menulink = document.getElementById("menu-link");
                menulink.addEventListener("click", function toggleMenu(){
                        window.event.preventDefault();
                        menulink.classList.toggle('active');
                        menu.classList.toggle('active');              
                    });
            };
        </script>
        <!-- 不蒜子 -->
        <script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>

    <meta name="description" content="<p>git各种错误提交后的应对和处理</p>" />

    <meta name="tags" content="git" />
  <!-- 替换部分base的样式，看文章时，要再宽一点，右边有很多空间可以撑开 -->
  <link rel="stylesheet" type="text/css" href="/theme/css/mycss/article.css" />

</head>
<body>
    <div role="banner" id="masthead">
        <header>
            <a href="/"><img src="/images/mowang.png" alt="McManus Logo"></a>
                <h1>来玩魔王的咚@骑士救兵</h1>
            <a href="#menu" id="menu-link">more stuff</a>
            <nav id="menu">
                <ul>
                        <li><a href="/tags">tags</a></li>
                            <li><a href="/category/cloud.html">Cloud</a></li>
                            <li><a href="/category/docker.html">Docker</a></li>
                            <li><a href="/category/go.html">Go</a></li>
                            <li><a href="/category/linux.html">Linux</a></li>
                            <li><a href="/category/python.html">Python</a></li>
                            <li class="active"><a href="/category/xue-xi-bi-ji.html">学习笔记</a></li>
                            <li><a href="/category/yun-wei-zi-dong-hua.html">运维自动化</a></li>
                </ul>
            </nav>
        </header>
    </div>
        <div class="page" role="main">
  <div class="article" role="article">
    <article>
        <footer>
            <a name="top"></a>
            <p>
              <time datetime=" 2020-07-03 09:30:00+08:00">
                <script>document.write(moment('2020-07-03 09:30:00+08:00').format('LL'));</script>
              </time>
              ~
              <time datetime=" 2020-07-03 09:30:00+08:00">
                <script>document.write(moment('2021-01-13 10:00:00+08:00').format('LL'));</script>
              </time>
            </p>
        </footer>
        <header>
          <h2>
            git骚操作
          </h2>
        </header>
      <div class="content">
         <div class="toc">
<ul>
<li><a href="#xiu-gai-shang-yi-ci-ti-jiao">修改上一次提交</a></li>
<li><a href="#xiu-gai-fen-zhi-ming">修改分支名</a></li>
<li><a href="#zhi-jie-zai-zhu-fen-zhi-shang-zuo-le-xiu-gai">直接在主分支上做了修改</a></li>
<li><a href="#tian-jia-le-cuo-wu-de-wen-jian">添加了错误的文件</a></li>
<li><a href="#fang-qi-ben-di-xiu-gai">放弃本地修改</a></li>
<li><a href="#zhong-ji-da-zhao">终极大招</a></li>
<li><a href="#github-cao-zuo">github 操作</a><ul>
<li><a href="#wan-quan-fu-gai-yuan-cheng-cang-ku">完全覆盖远程仓库</a></li>
<li><a href="#fu-gai-yi-ge-fen-zhi">覆盖一个分支</a></li>
<li><a href="#shan-chu-yuan-cheng-zui-hou-yi-ci-ti-jiao">删除远程最后一次提交</a></li>
<li><a href="#cong-yuan-cheng-cang-ku-shan-chu-wen-jian">从远程仓库删除文件</a></li>
</ul>
</li>
<li><a href="#ge-ren-xin-de-bu-chong">个人心得补充</a><ul>
<li><a href="#wei-zai-zui-xin-de-fen-zhi-shang-zuo-le-xiu-gai">未在最新的分支上做了修改</a></li>
</ul>
</li>
</ul>
</div>
<p>在使用Git的过程中，难免会发生一些类似笔误的问题。由于每一步操作都会留有记录，即使之后再进行一次提交，修改为正确的版本，也会留下之前错误提交的记录。其实这些错误的提交都是有更好的办法来进行改正的。  </p>
<h3 id="xiu-gai-shang-yi-ci-ti-jiao"><a class="toclink" href="#xiu-gai-shang-yi-ci-ti-jiao">修改上一次提交</a></h3>
<p>官方文档上有一篇有关撤销操作的内容：<br>
https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD%9C<br>
可以参考下官方的说明。<br>
这里结合一下实际容易遇到的问题，并且给出解决方案。  </p>
<p>在 <code>git add</code> 之后，执行 <code>git commit</code> 进行提交。直接运行 <code>git commit</code> 会弹出文本编辑器修改提交的消息。可以使用 -m 参数 <code>git commit -m "message"</code> 直接在命令行中提供提交消息。<br>
<strong>问题</strong><br>
提交了错误的消息，比如拼错误。需要修改上一次提交的消息。<br>
可以用下面的命令，更改最后一次提交的消息：</p>
<div class="highlight"><pre><span></span><code>$ git commit --amend
$ git commit --amend -m <span class="s2">&quot;message2&quot;</span>
</code></pre></div>

<p><strong>问题</strong><br>
在完成提交后，发现上一次的提交有问题。比如漏提交了文件，或者某个文件要再修改一下。
当然再提交一个版本也是可以的，不过使用--amend后，可以把新的内容提交上上一次提交内容里：</p>
<div class="highlight"><pre><span></span><code>$ git add .
$ git commit --amend
</code></pre></div>

<p><strong>问题</strong><br>
如果提交已经上传到远程仓库了。经过上面的修改后，本地的版本和远程仓库不一致，所以无法直接提交到远程仓库。这就需要强制提交：</p>
<div class="highlight"><pre><span></span><code>$ git push --force
</code></pre></div>

<p>强制提交后会，在远程仓库上留下一条扎眼的<strong>强制推送</strong>的高亮提交的信息。这个强制推送的痕迹似乎是无法解决的。<br>
这里的做法是提交有问题，想办法把远程仓库里上一次错误的提交修改正确。<br>
还有一个思路是删除远程仓库上一次的提交记录，而本地保留着最新的记录。然后再执行一次强制推送。下面会再讲<strong>删除远程最后一次提交</strong>的方法。  </p>
<h3 id="xiu-gai-fen-zhi-ming"><a class="toclink" href="#xiu-gai-fen-zhi-ming">修改分支名</a></h3>
<p>创建分支使用命令：</p>
<div class="highlight"><pre><span></span><code>$ git branch branch_name
</code></pre></div>

<p>这里只是创建一个分支，并不会切换当前的分支。要切换分支要使用checkout命令：</p>
<div class="highlight"><pre><span></span><code>$ git checkout branch_name
</code></pre></div>

<p>如果要开启一个新的分支并且在新分支上做修改，就是用上面2条命令，也可以一条命令解决：</p>
<div class="highlight"><pre><span></span><code>$ git checkout -b branch_name
</code></pre></div>

<p><strong>问题</strong><br>
分支名错了，要修改分支名。<br>
可以使用-m参数来修改分支名：</p>
<div class="highlight"><pre><span></span><code>$ git branch -m branch_name new_branch_name
</code></pre></div>

<p><strong>问题</strong><br>
错误的分支名已经推送到远程服务器上了。<br>
这时候只能把远端的错误的分支删除掉，然后上传新的分支：</p>
<div class="highlight"><pre><span></span><code>$ git push origin --delete branch_name
$ git push origin new_branch_name
</code></pre></div>

<h3 id="zhi-jie-zai-zhu-fen-zhi-shang-zuo-le-xiu-gai"><a class="toclink" href="#zhi-jie-zai-zhu-fen-zhi-shang-zuo-le-xiu-gai">直接在主分支上做了修改</a></h3>
<p>如果还没有commit，那么直接切换分支，然后提交修改就好了。<br>
<strong>问题</strong><br>
已经提交了临时的修改在主分支上了，使用下面3条命令：</p>
<div class="highlight"><pre><span></span><code>$ git branch branch_name
$ git reset HEAD~ --hard
$ git checkout branch_name
</code></pre></div>

<p>第一条命令，创建了分支之后，主分支和新的分支都在当前这个版本上。并且当前分支还是主分支。<br>
第二条命令，HEAD~是将HEAD回退一次，由于当前分支还是主分支，主分支就回退了一个版本，新的分支还在最新的版本上。<br>
HEAD~后面的~号是表示将HEAD向之前回退一个版本。如果没有~，就是回退到HEAD也就是当前的版本（由于刚commit过，应该是什么也不会发生）。<br>
--hard参数也需要，如果没有这个参数，版本会回退，但是本地的一些新建的文件会保留。因为第一条命令后，这些更改都已经在新的分支上了，所以新建的文件不需要保留。如果留着这些文件，在执行第三条命令的时候，会发生冲突，因为本地已经有一个文件了，在进行切换的时候，新分支上的文件和本地的文件同名发生冲突。<br>
第三条命令，切换到新的分支，继续在新分支上工作。  </p>
<h3 id="tian-jia-le-cuo-wu-de-wen-jian"><a class="toclink" href="#tian-jia-le-cuo-wu-de-wen-jian">添加了错误的文件</a></h3>
<p>添加文件使用的命令是 <code>git add</code>，可以用点来提交所有的文件：</p>
<div class="highlight"><pre><span></span><code>$ git add .
</code></pre></div>

<p>如果发现add错了，可以使用 <code>git reset</code> 命令：</p>
<div class="highlight"><pre><span></span><code>$ git reset
$ git reset filename
</code></pre></div>

<p>不带参数撤回所有的添加，加上文件名则只撤回指定的文件。</p>
<p><strong>问题</strong><br>
已经commit了。</p>
<div class="highlight"><pre><span></span><code>$ git reset --soft HEAD~
</code></pre></div>

<p>这样就是回到了commit之前，add之后的状态。如果不带--soft参数，则是在add之前的状态。然后再重新提交一次。  </p>
<p><strong>小结 git reset</strong><br>
已经用到两次 <code>git reset</code> 了，总结一下：</p>
<ul>
<li>HEAD 表示当前的位置</li>
<li>HEAD~ 表示回退一个版本，可以根数字，默认是1。</li>
<li>HEAD~2 表示回退2个版本。</li>
<li>--hard 删除文件</li>
<li>--soft 保留文件 git add 之后的状态</li>
<li>默认也是保留文件，是git add之前的状态。</li>
</ul>
<h3 id="fang-qi-ben-di-xiu-gai"><a class="toclink" href="#fang-qi-ben-di-xiu-gai">放弃本地修改</a></h3>
<p>放弃本地修改，使用服务器代码覆盖本地内容：</p>
<div class="highlight"><pre><span></span><code>$ git fetch --all
$ git reset --hard origin/master 
$ git pull
</code></pre></div>

<p>使用master分支覆盖本地。如果要用其它分支覆盖本地，则更改第二条命令的参数。</p>
<p><code>git fetch</code>: 从远程下载最新的，而不尝试合并或rebase任何东西。<br>
<code>git reset</code>: 将主分支重置为您刚刚获取的内容。--hard参数，更改所有的文件。<br>
<code>git pull</code>: 上面2步就完成了，这步不需要，作用是验证一下是否已经和远程一致。  </p>
<p>更加保险的做法是在重置之前，重建一个分支来保存当前的修改：</p>
<div class="highlight"><pre><span></span><code>$ git checkout master
$ git branch master-bak
$ git fetch --all
$ git reset --hard origin/master
</code></pre></div>

<p>所有旧的提交都将保存在masterbak中。然而，没有提交的更改(即使staged)将会丢失。确保存储和提交任何你需要的东西。</p>
<h3 id="zhong-ji-da-zhao"><a class="toclink" href="#zhong-ji-da-zhao">终极大招</a></h3>
<p>使用命令 <code>git reflog</code> 可以显示所有事情的列表。然后就可以选择一个时间点，切换到那个时候的状态。不建议轻易使用。<br>
切换时使用命令：</p>
<div class="highlight"><pre><span></span><code>$ git reset HEAD@<span class="o">{</span>index<span class="o">}</span>
</code></pre></div>

<p>{index}替换为 <code>git reflog</code> 命令输出的每一行最左边的一串id号。  </p>
<h3 id="github-cao-zuo"><a class="toclink" href="#github-cao-zuo">github 操作</a></h3>
<p>如果已经把修改上传到了远程仓库，则需要把远程仓库的提交也进行修改。<br>
常发生的一个问题是提交了敏感信息，比如密码。还有一个情况是上传了数据文件，数据文件如果很大，会使你的仓库变得很大。<br>
以上两种情况都需要把文件彻底得从仓库中删除掉，不应该在仓库中留下任何数据。  </p>
<p>下面展开一些其他情况的补救方法。</p>
<h4 id="wan-quan-fu-gai-yuan-cheng-cang-ku"><a class="toclink" href="#wan-quan-fu-gai-yuan-cheng-cang-ku">完全覆盖远程仓库</a></h4>
<p>这个方法简单粗暴，但是风险也很大。做之前可以先把远程仓考clone下来：</p>
<div class="highlight"><pre><span></span><code>$ git clone &lt;版本库的网址&gt;
</code></pre></div>

<p>如果本地仓库完全没有问题，则可以强制将本地的仓库完全覆盖掉远程仓库：</p>
<div class="highlight"><pre><span></span><code>$ git push origin --force --all
</code></pre></div>

<p>参数--force是强制推送。<br>
参数--all是指所有分支。这个参数是可以看情况使用，不加的话就是只覆盖一个分支，只覆盖一个分支可以看下一小节的内容。</p>
<h4 id="fu-gai-yi-ge-fen-zhi"><a class="toclink" href="#fu-gai-yi-ge-fen-zhi">覆盖一个分支</a></h4>
<p>这里以主分支为例，删除master分支再提交一个新的作为master分支。<br>
这里的方法稍微温和一点。先将远程的分支删除掉，然后再把本地的分支推送到远程。相当于是覆盖远程仓考，不过覆盖的范围只是一个分支。<br>
另外。在操作前还做了备份的工作以防万一。并且这个备份的分支也是可以推送到远程仓库上去的。<br>
创建备份分支，以防万一：</p>
<div class="highlight"><pre><span></span><code>$ git branch old_master
$ git push origin old_master:old_master
</code></pre></div>

<p>创建后，可以将这个分支也推送到远程仓库上。最后还可以再删除这个分支。</p>
<p>删除远程的master分支：</p>
<div class="highlight"><pre><span></span><code>$ git push origin :master
</code></pre></div>

<p><strong>关于删除远程分支的命令</strong><br>
推送本地分支到远程的完整命令如下：</p>
<div class="highlight"><pre><span></span><code>$ git push <span class="o">[</span>远程名<span class="o">]</span> <span class="o">[</span>本地分支<span class="o">]</span>:<span class="o">[</span>远程分支<span class="o">]</span>
</code></pre></div>

<p>一般提交的时候会省略后面的远程分支名。而删除时分支则是本地分支名留空，只写冒号和远程分支名。可以理解为推送一个空的本地分支到远程分支，就是删除远程分支了。<br>
要删除分支也可以使用 <code>-d, --delete</code> 参数，下面的2个命令是一样的效果：</p>
<div class="highlight"><pre><span></span><code>$ git push origin --delete &lt;BranchName&gt;
$ git push origin :&lt;BranchName&gt;
</code></pre></div>

<p><strong>提交新的master分支</strong><br>
本地完成master分支的修改后，再提交到远程：</p>
<div class="highlight"><pre><span></span><code>$ git push origin master
</code></pre></div>

<p>这里还在远程仓库留着一个用作备份的分支，如果需要再删除掉。</p>
<h4 id="shan-chu-yuan-cheng-zui-hou-yi-ci-ti-jiao"><a class="toclink" href="#shan-chu-yuan-cheng-zui-hou-yi-ci-ti-jiao">删除远程最后一次提交</a></h4>
<p>关于提交错误后的补救，上面已经讲个一个思路了。这里是另一种思路。  </p>
<p><strong>基本的操作</strong><br>
先在本地回滚一个版本，然后强行推送至远程仓库：</p>
<div class="highlight"><pre><span></span><code>$ git reset HEAD~
$ git push --force
</code></pre></div>

<p>上面reset没有加参数，回退后，修改的文件还保留在本地。就是 <code>git add</code> 前的状态。<br>
执行完上面2条命令后，远程仓库的最后一次提交没有了。而本地的修改还在。这个时候再对之前提交有问题的地方进行修改，然后执行常规的提交操作：</p>
<div class="highlight"><pre><span></span><code>$ git add .
$ git commit -m <span class="s2">&quot;message&quot;</span>
$ git push
</code></pre></div>

<p><strong>加上暂存功能的操作</strong><br>
用上 <code>git stash</code> 的暂存功能：</p>
<div class="highlight"><pre><span></span><code>$ git reset commitId
$ git stash
$ git push --force
$ git stash pop
$ git add . 
$ git commit -m <span class="s2">&quot;massage&quot;</span> 
$ git push
</code></pre></div>

<p>这里使用暂存的效果好像有点多余，因为stash和pop中间没有修改的操作。这么做大概是为了防止在pop之前还可能会有其他计划外的操作。  </p>
<h4 id="cong-yuan-cheng-cang-ku-shan-chu-wen-jian"><a class="toclink" href="#cong-yuan-cheng-cang-ku-shan-chu-wen-jian">从远程仓库删除文件</a></h4>
<p>下面这篇是github上的，应该是官方的help文档。比较权威，可以参考。<br>
Removing sensitive data from a repository:<br>
https://help.github.com/en/articles/removing-sensitive-data-from-a-repository  </p>
<p>对于敏感文件（比如密码），数据文件（很大又无用），这些文件是不应该提交的。如果是马上就发现了，可以用上面的那些方法及时改正。<br>
还有可能遇到一种情况是，文件提交后很长一段时间没有发觉，之后再要从仓库中删除掉，就无法用上面提到的方法了。<br>
这里要讲的是针对这些文件，而无论这些文件是在多久之前就提交的。<br>
这时就需要从每一个快照中移除掉文件，用下面的命令就可以实现：</p>
<div class="highlight"><pre><span></span><code>$ git filter-branch --tree-filter <span class="s1">&#39;rm -f filename&#39;</span> HEAD
</code></pre></div>

<p>命令执行后，将提交历史中所有提交的该文件彻底删除，永远无法通过Git找回。  </p>
<p><strong>疑问</strong><br>
这个方法没试过，并且说的也只是解决了本地仓库的痕迹。远程仓库的话需要再执行一次强制推送，但是之前的文件有可能还是在的，没测试过。<br>
官方文档中的命令要复杂的多，并且步骤也更多。如果真遇到这个问题，不行还是要按照官方的文档操作。并且还要仔细验证。  </p>
<h3 id="ge-ren-xin-de-bu-chong"><a class="toclink" href="#ge-ren-xin-de-bu-chong">个人心得补充</a></h3>
<p>其他困扰过自己的情况。操作完成后，补充在这里。  </p>
<h4 id="wei-zai-zui-xin-de-fen-zhi-shang-zuo-le-xiu-gai"><a class="toclink" href="#wei-zai-zui-xin-de-fen-zhi-shang-zuo-le-xiu-gai">未在最新的分支上做了修改</a></h4>
<p>多人协作的时候，这种情况可能很常见。<br>
对于个人的项目，本地做了小修改，感觉没必要再提交到远程仓库，也不想强制提交。换了个工作电脑，提交了一个版本。回来后继续工作，本地已经不是最新的版本了，但是本地有未保存的修改内容。由于本地不是最新的版本，需要从远程仓库拉取或同步最新的版本，但是本地有未保存的内容，是不允许你同步的。此时会给出错误消息以及两个建议。<br>
一、先提交（commit）本地的版本，再同步：</p>
<div class="highlight"><pre><span></span><code>$ git add .
$ git commit -m <span class="s2">&quot;提本地版本&quot;</span>
$ git pull
</code></pre></div>

<p>拉取后，需要处理合并冲突，然后可以继续工作。  </p>
<p>二、<strong>推荐</strong>，暂存（stash）本地的修改，再同步：</p>
<div class="highlight"><pre><span></span><code>$ git stash
$ git pull
$ git stash pop
</code></pre></div>

<p>之后还是处理合并冲突，然后可以继续工作。比上面少一次提交，如果之前的未报错的修改并没有告一段落，不配有一次单独的提交操作的话，这么做正合适。<br>
关于暂存（stash）的操作，对应VScode中存储里的操作。上面的3步对应的是<strong>存储</strong>、<strong>拉取</strong>和<strong>弹出最新存储</strong>。  </p>
<p>三、签出一个新分支，步骤如下:</p>
<div class="highlight"><pre><span></span><code>$ git branch temp
$ git reset HEAD~ --hard
$ git pull
$ git merge temp
$ git branch -d temp
</code></pre></div>

<p>以上步骤未验证过。  </p>
      </div>
      <div class="back-to-top">
        <a href="/">HOME</a>
        <a href="#top">TOP</a>
      </div>
    </article>
  </div>
<!-- end article -->
<!-- 页面往下滚动一段之后才会显示TOC -->
<script>
  window.onscroll = function() {
    var tocbox = document.getElementsByClassName('toc')[0];
    var osTop = document.documentElement.scrollTop || document.body.scrollTop;
    var osWidth = document.documentElement.scrollWidth || document.body.scrollWidth;
    // console.log(osTop)
    if (osTop>300 && osWidth>865) {
      tocbox.style.display = "block"
    }
    if (osTop<300 || osWidth<865) {
      tocbox.style.display = "none"
    }
  }
</script>
                <footer>
                    <div class="icons">
                    </div>
                    <span id="busuanzi_container_page_pv" style="padding: 10px">本文阅读量<span id="busuanzi_value_page_pv"></span>次</span>
                    <span id="busuanzi_container_site_pv" style="padding: 10px">本站总访问量<span id="busuanzi_value_site_pv"></span>次</span>
                    <span id="busuanzi_container_site_uv" style="padding: 10px">本站总访客数<span id="busuanzi_value_site_uv"></span>人</span>
                    <p>© <script>document.write(moment().format('YYYY'));</script> 749B</p>
                </footer>
        </div>
</body>
</html>